﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Data;
using System.Web;

namespace RegisterationCommon.Common
{
    /// <summary>
    /// 系统配置实体操作类
    /// </summary>
    public class Config
    {
        #region 局部变量
        //配置ID
        private int _ID = 0;
        //当前登录的账号类型,0=默认,即学生家长,1=学校,2=教育局
        private int _CurrentAccountType = 0;
        //系统名称
        private string _Name = "";
        //是否停止学生登记
        private bool _IsStopSignup = false;
        //是否停止学校审核
        private bool _IsStopCheck = false;
        //网站头部Meta关键字
        private string _MetaKey = "";
        //网站头部Meta描述
        private string _MetaDesc = "";
        //数据自动备份时间
        private string _AutoDBBakupTime = "";
        //数据自动备份间隔
        private int _AutoDBBakupDay = 0;
        //系统最近一次备份时间
        private DateTime _LastDBBakupTime = DateTime.Now;
        //系统最近一次还原时间
        private DateTime _LastDBRestoreTime = DateTime.Now;
        //消息语言文件所在目录
        private string _MessagePath = HttpContext.Current.Server.MapPath(@"/Framework/Language/");
        //消息语言类型
        private string _Language = "zh-cn";
        //审核查看时间
        private DateTime _Openingtime = DateTime.Now;

        #endregion

        #region 方法
        /// <summary>
        /// 审核查看时间
        /// </summary>
        public DateTime Openingtime
        {
            get { return _Openingtime; }
            set { _Openingtime = value; }
        }
        /// <summary>
        /// 消息语言类型
        /// </summary>
        public string Language
        {
            get { return _Language; }
            set { _Language = value; }
        }
        /// <summary>
        /// 消息语言文件所在目录
        /// </summary>
        public string MessagePath
        {
            get { return _MessagePath; }
            set { _MessagePath = value; }
        }
        /// <summary>
        /// 系统最近一次还原时间
        /// </summary>
        public DateTime LastDBRestoreTime
        {
            get { return _LastDBRestoreTime; }
            set { _LastDBRestoreTime = value; }
        }
        /// <summary>
        /// 系统最近一次备份时间
        /// </summary>
        public DateTime LastDBBakupTime
        {
            get { return _LastDBBakupTime; }
            set { _LastDBBakupTime = value; }
        }
        /// <summary>
        /// 数据自动备份间隔
        /// </summary>
        public int AutoDBBakupDay
        {
            get { return _AutoDBBakupDay; }
            set { _AutoDBBakupDay = value; }
        }
        /// <summary>
        /// 数据自动备份时间
        /// </summary>
        public string AutoDBBakupTime
        {
            get { return _AutoDBBakupTime; }
            set { _AutoDBBakupTime = value; }
        }
        /// <summary>
        /// 网站头部Meta描述
        /// </summary>
        public string MetaDesc
        {
            get { return _MetaDesc; }
            set { _MetaDesc = value; }
        }
        /// <summary>
        /// 网站头部Meta关键字
        /// </summary>
        public string MetaKey
        {
            get { return _MetaKey; }
            set { _MetaKey = value; }
        }
        /// <summary>
        /// 是否停止学校审核
        /// </summary>
        public bool IsStopCheck
        {
            get { return _IsStopCheck; }
            set { _IsStopCheck = value; }
        }
        /// <summary>
        /// 是否停止学生登记
        /// </summary>
        public bool IsStopSignup
        {
            get { return _IsStopSignup; }
            set { _IsStopSignup = value; }
        }
        /// <summary>
        /// 配置ID
        /// </summary>
        public int ID
        {
            get { return _ID; }
            set { _ID = value; }
        }
        /// <summary>
        /// 当前登录的账号类型,0=默认,即学生家长,1=学校,2=教育局
        /// </summary>
        public int CurrentAccountType
        {
            get { return _CurrentAccountType; }
            set
            {

                Cookies.Set("CurrentAccountType", Convert.ToString(value));
                _CurrentAccountType = value;
            }
        }
        /// <summary>
        /// 系统名称
        /// </summary>
        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        #endregion

        #region 静态成员
        //获取当前配置
        private static Config _Current;
        /// <summary>
        /// 获取当前配置
        /// </summary>
        public static Config Current
        {
            get
            {
                if (Config._Current == null)
                {
                    Config._Current = new Config();
                    Config._Current.GetSystemConfig();
                }
                return Config._Current;
            }
        }
        #endregion

        #region 配置操作方法
        /// <summary>
        /// 获取配置信息
        /// </summary>
        /// <returns></returns>
        public bool GetSystemConfig()
        {
            DataTable DT = DBAction.GetDTFromSQL("Select Top 1 * From " + ETableName.SystemConfig);

            if (DT.Rows.Count < 1)
            {
                return false;
            }

            this._ID = Convert.ToInt32(DT.Rows[0]["ID"]);
            this._Name = DT.Rows[0]["Name"].ToString();
            this._IsStopSignup = (bool)DT.Rows[0]["IsStopSignup"];
            this._IsStopCheck = (bool)DT.Rows[0]["IsStopCheck"];
            this._MetaKey = DT.Rows[0]["MetaKey"].ToString();
            this._MetaDesc = DT.Rows[0]["MetaDesc"].ToString();
            this._AutoDBBakupTime = DT.Rows[0]["AutoDBBakupTime"].ToString();
            this._AutoDBBakupDay = Convert.ToInt32(DT.Rows[0]["AutoDBBakupDay"]);
            this._LastDBBakupTime = Convert.ToDateTime(DT.Rows[0]["LastDBBakupTime"]);
            this._LastDBRestoreTime = Convert.ToDateTime(DT.Rows[0]["LastDBRestoreTime"]);
            this._Openingtime = Convert.ToDateTime(DT.Rows[0]["Openingtime"]);
            //如果Cookies不存在，或者当前用户类型的Cookies值为null，则初始化CurrentAccountType
            if (!Cookies.Exists())
            {
                Cookies.Set("CurrentAccountType", Convert.ToString(this._CurrentAccountType));
            }
            else
            {
                this._CurrentAccountType = Convert.ToInt32(Cookies.Get("CurrentAccountType"));
            }
            return true;
        }

        /// <summary>
        /// 设置配置信息
        /// </summary>
        public bool SaveSystemConfig()
        {
            RParams RP = new RParams();
            RP.Add("ID", this._ID, SqlDbType.Int);
            RP.Add("Name", this._Name, SqlDbType.VarChar);
            RP.Add("IsStopSignup", this._IsStopSignup, SqlDbType.Bit);
            RP.Add("IsStopCheck", this._IsStopCheck, SqlDbType.Bit);
            RP.Add("MetaKey", this._MetaKey, SqlDbType.VarChar);
            RP.Add("MetaDesc", this._MetaDesc, SqlDbType.VarChar);
            RP.Add("AutoDBBakupTime", this._AutoDBBakupTime, SqlDbType.VarChar);
            RP.Add("AutoDBBakupDay", this._AutoDBBakupDay, SqlDbType.Int);
            RP.Add("LastDBBakupTime", this._LastDBBakupTime, SqlDbType.DateTime);
            RP.Add("LastDBRestoreTime", this._LastDBRestoreTime, SqlDbType.DateTime);
            RP.Add("Openingtime", this._Openingtime, SqlDbType.DateTime);
            string colFields = "Name,IsStopSignup,IsStopCheck,MetaKey,MetaDesc,AutoDBBakupTime,AutoDBBakupDay,LastDBBakupTime,LastDBRestoreTime,Openingtime";
            string whereFields = "ID=@ID";

            return DBAction.Update(ETableName.SystemConfig.ToString(), colFields, whereFields, RP);
        }
        #endregion

        #region 获取加载后的语言配置对象
        /// <summary>
        /// 获取语言配置的XmlDocument对象
        /// </summary>
        /// <returns></returns>
        public XmlDocument GetLanguageDoc()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(_MessagePath + _Language + ".xml");

            return doc;
        }
        /// <summary>
        /// 获取语言配置的XmlElement对象
        /// </summary>
        /// <returns></returns>
        public XmlElement GetElement()
        {
            XmlDocument doc = this.GetLanguageDoc();
            return doc.DocumentElement;
        }
        #endregion

        #region 获取管理菜单
        #region 根据角色类型获取菜单
        /// <summary>
        /// 根据角色类型获取菜单
        /// </summary>
        /// <returns></returns>
        public string GetMenuForRule()
        {
            XmlDocument doc = GetLanguageDoc();
            XmlElement el = doc.DocumentElement;
            XmlNode rootNode = el.SelectSingleNode(@"menu/group[@rule='2']");

            //创建菜单
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("<ul class=\"easyui-tree\" id=\"mainTree\">");
            sb.Append(GetChildList(rootNode));
            sb.AppendLine("</ul>");

            return sb.ToString();
        }
        #endregion

        #region 获取并生成菜单子节点
        /// <summary>
        /// 获取并生成菜单子节点
        /// </summary>
        /// <param name="parent">XmlNode类型的父子节点元素</param>
        /// <returns></returns>
        private StringBuilder GetChildList(XmlNode parent)
        {
            StringBuilder sb = new StringBuilder();

            if (parent == null)
            {
                return sb;
            }
            //如果没有子节点则返回
            if (parent.HasChildNodes)
            {
                //循环获取子节点
                foreach (XmlNode nd in parent.SelectNodes("item"))
                {
                    ////定义是否采用了方法方式获取菜单
                    //bool IsFunc = false;

                    ////判断是否拥有显示权限或者要调用的方法
                    //if (nd.Attributes["option"] != null)
                    //{
                    //    //判断是否直接隐藏菜单项
                    //    if (nd.Attributes["option"].Value == "Hidden")
                    //    {
                    //        continue;
                    //    }

                    //    //判断指定的选项是否为属性
                    //    if (nd.Attributes["option"].Value.Contains('='))
                    //    {
                    //        bool IsPass = true;

                    //        //表示选项指定了类的属性
                    //        string[] attrArr = nd.Attributes["option"].Value.Split(';');
                    //        for (int n = 0; n < attrArr.Length; n++)
                    //        {
                    //            if (!ParserAttr(attrArr[n]))
                    //            {
                    //                IsPass = false;
                    //                break;
                    //            }
                    //        }

                    //        //如果未通过验证，则跳过此次循环体读取下一个菜单节点
                    //        if (!IsPass)
                    //        {
                    //            continue;
                    //        }
                    //    }
                    //    else
                    //    {
                    //        //表示选项指定了方法
                    //        IsFunc = true;
                    //    }
                    //}

                    //设置链接
                    if (nd.Attributes["href"].Value == "")
                    {
                        sb.AppendLine("<li><span>" + nd.Attributes["text"].Value + "</span>");
                    }
                    else
                    {
                        sb.AppendLine("<li><span><a href='" + nd.Attributes["href"].Value + "' target='contentFrame'>" + nd.Attributes["text"].Value + "</a></span>");
                    }

                    ////如果选定中包含了方法，则采用方法获取子菜单
                    //if (IsFunc)
                    //{
                    //    sb.AppendLine("<ul>");
                    //    sb.Append(ParserFunc(nd.Attributes["option"].Value));
                    //    sb.AppendLine("</ul>");
                    //}
                    //else
                    //{
                    //判断是否存在子元素
                    if (nd.HasChildNodes)
                    {
                        sb.AppendLine("<ul>");
                        sb.Append(GetChildList(nd));
                        sb.AppendLine("</ul>");
                    }
                    // }
                    sb.AppendLine("</li>");
                }
            }
            return sb;
        }
        #endregion

        #region 属性选项解析
        /// <summary>
        /// 属性选项解析
        /// </summary>
        /// <param name="exp">选项表达式</param>
        private bool ParserAttr(string exp)
        {
            //是否通过
            bool IsPass = false;

            //string[] expArr = exp.Split('=');
            //string[] paramArr = expArr[0].Split('_');

            //switch (paramArr[0])
            //{
            //    case "Account":
            //        switch (paramArr[1])
            //        {
            //            //是否启用（即：用户状态）
            //            case "IsEnable":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Account.Current.IsEnable))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //是否超级账号
            //            case "IsSuper":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Account.Current.IsSuper))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //是否区域超级账号
            //            case "IsAreaSuper":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Account.Current.IsAreaSuper))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //账号类型
            //            case "AccountType":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Account.Current.AccountType))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //所属角色  1=企业账号  2=集团账号  3=行政单位
            //            case "ForRuleID":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Account.Current.ForRuleID))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //        }
            //        break;
            //    case "Config":
            //        switch (paramArr[1])
            //        {
            //            //数据是否逐级审核
            //            case "IsProgAudit":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Config.Current.IsProgAudit))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //是否允许企业下载本公司统计数据
            //            case "IsEnableEntDown":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Config.Current.IsEnableEntDown))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //是否允许集团下载本集团下属企业统计数据
            //            case "IsEnableGroupDown":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Config.Current.IsEnableGroupDown))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //企业是否允许管理自身的账号
            //            case "EntManageAccount":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Config.Current.EntManageAccount))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //集团是否允许管理自身的账号
            //            case "GroupManageAccount":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Config.Current.GroupManageAccount))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //            //是否开启外省企业数据上报
            //            case "OtherProvincesReported":
            //                if (Convert.ToInt32(expArr[1]) == Convert.ToInt32(Config.Current.OtherProvincesReported))
            //                {
            //                    IsPass = true;
            //                }
            //                break;
            //        }
            //        break;
            //    default:
            //        IsPass = false;
            //        break;
            //}

            return IsPass;
        }
        #endregion

        #region 方法选项解析
        public string ParserFunc(string exp)
        {
            string parsedData = "";
            //switch (exp)
            //{
            //    //月报表的历史记录
            //    case "getMonthReportHistory":
            //        parsedData = getReportHistory("Month");
            //        break;
            //    //季报表的历史记录
            //    case "getQuarterReportHistory":
            //        parsedData = getReportHistory("Quarter");
            //        break;
            //}

            return parsedData;
        }
        #endregion
        #endregion
    }
}
